package cangyan.msgcenter.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisException;

public class JedisUtil {
    private static JedisPool jedisPool = null;
    private static final Logger log = LoggerFactory.getLogger(JedisUtil.class);
    /**
     * 构建redis连接池
     * 
     * @param ip
     * @param port
     * @return JedisPool
     */
    public static JedisPool initJedisPool() {
        log.info("初始化Redis连接池");
        if (jedisPool == null) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(100);
            //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
            config.setMaxIdle(25);
            //表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException；
            config.setMaxWaitMillis(1000 * 10);
            //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
            config.setTestOnBorrow(true);
            jedisPool = new JedisPool(config, "192.168.11.12", 6379);
            Jedis jedis = null;
            try{
                jedis = getJedis(); 
                jedis.set("initTime", DateUtil.getFormatDate());
            }catch(Exception e){
                returnBrokenJedis(jedis);
                log.error("",e);
            }
        }
        return jedisPool;
    }
    
    public static Jedis getJedis(){
        if(jedisPool==null){
            initJedisPool();
        }
        return jedisPool.getResource();
    }
    
    public static void destroyJedisPool(){
        if(jedisPool != null){
            jedisPool.destroy();
        }
    }
    
    /**
     * 返还到连接池
     * <br/>使用完需要把jedis返回到连接池,2.5以后是自动回收
     * @param jedis
     */
    public static void returnJedis(Jedis jedis){
        if(jedis == null){
            return;
        }
        if(jedisPool != null){
            try{
                jedisPool.returnResource(jedis);
            }catch(JedisException t){
                jedisPool.returnBrokenResource(jedis);
            }
            jedis = null;
        }
    }

    /**
     * 释放redis对象
     * <br/>异常时候需要释放redis对象
     * @param jedis
     */
    public static void returnBrokenJedis(Jedis jedis){
        if(jedis == null){
            return;
        }
        if(jedisPool != null){
            jedisPool.returnBrokenResource(jedis);
            jedis = null;
        }
    }
}
